home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ask / askdates / source / askdates.s < prev    next >
Text File  |  1998-08-24  |  30KB  |  1,220 lines

  1. ******************************************************************************
  2. *    ASK3アクセサリ  ASKDates  V2.01
  3. *        Copyright 1998 by AIG-Soft
  4. ******************************************************************************
  5.  
  6.     .include    defines.mac
  7.     .include    pspdef.mac
  8.     .include    ask3.mac
  9.     .cpu        68000
  10.  
  11. ******************************************************************************
  12. *    常駐ルーチン
  13. ******************************************************************************
  14. * 1998をわざわざテキストでなしにバイナリー化しているのは、テキストのみより
  15. * 誤った一致をしにくいから
  16.  
  17.     .text
  18.     .even
  19. KEEP_START:
  20.     * 常駐確認用識別子
  21. id:    .dc.b    'ASKDates V2.01',19,98,'AIG-Soft',0
  22.  
  23. ******************************************************************************
  24. * ワーク1
  25. ******************************************************************************
  26. * このワークエリアは起動時に初期値が必要/初期化時に利用するものである。
  27. *
  28.     .even
  29. ACh        .dc.l    -1    * アクセサリアドレス(初期値-1<0)
  30.                 * 正常登録された時、ACh>=0になる(0,1,2,3...)
  31.  
  32. Ffmt0        .dc.l    0    * フォーマットワーク(全部)
  33. Ffmt        .dc.l    0    * フォーマットワーク(フォーマット部分のみ)
  34. Ffmte        .dc.l    0    * フォーマットワーク最終アドレス+1
  35. Dfmt        .dc.l    0    * 現在参照中のフォーマット
  36. all        .dc.l    0    * ワークエリアサイズ
  37.  
  38. first        .dc.b    $ff    * No=$00/Yes=$ff
  39. fhigh        .dc.b    $ff    * 高位メモリー確保(=0:No,!=0:Yes)
  40.     .even
  41.  
  42. ******************************************************************************
  43. * メッセージ
  44. ******************************************************************************
  45.  
  46. MesNichiji    .dc.b    '日時選択',0
  47.     .even
  48.  
  49. ******************************************************************************
  50. * フォーマット指定子
  51. ******************************************************************************
  52. * 置換対象文字列は$ffxxで示される
  53. * $ffは漢字2バイト目に来ない
  54. .if    0
  55. YR4    equ    $ff01    * 西暦4桁
  56. YR2    equ    $ff02    * 西暦下2桁
  57. GN2    equ    $ff03    * 平成2桁
  58. MON    equ    $ff04    * 月2桁
  59. DAY    equ    $ff05    * 日2桁
  60. WKE    equ    $ff06    * 曜日英字3桁
  61. WKJ    equ    $ff07    * 曜日日本語1桁
  62. H24    equ    $ff08    * 24時制時間
  63. H12    equ    $ff09    * 12時制時間
  64. APM    equ    $ff0a    * AM/PM
  65. MIN    equ    $ff0b    * 分
  66. SEC    equ    $ff0c    * 秒
  67. .endif
  68. ******************************************************************************
  69.  
  70. StoreFMT:
  71. * 指定フォーマットで文字列をストアする
  72. * d0.b <- フォーマット置換番号(1~)
  73. * a2.l <- バッファー
  74. * -> a2.l
  75. * d0/d1/d2/a1破壊
  76.     movem.l    d4-d5,-(sp)
  77.     move.w    week(opc),d4
  78.     move.w    hh(opc),d5
  79.     moveq.l    #0,d1
  80.     move.b    d0,d1            * .b = .w
  81.     add.w    d1,d1
  82.     move.w    Ftable-2(pc,d1.w),d0    * 番号は1からだから-2しておく
  83.     jsr    Ftable(pc,d0.w)
  84.     movem.l    (sp)+,d4-d5
  85.     rts
  86. *
  87. Ftable:
  88.     .dc.w    Jfmt01-Ftable    * 西暦4桁
  89.     .dc.w    Jfmt02-Ftable    * 西暦下2桁
  90.     .dc.w    Jfmt03-Ftable    * 平成2桁
  91.     .dc.w    Jfmt04-Ftable    * 月2桁
  92.     .dc.w    Jfmt05-Ftable    * 日2桁
  93.     .dc.w    Jfmt06-Ftable    * 曜日英字3桁
  94.     .dc.w    Jfmt07-Ftable    * 曜日日本語1桁
  95.     .dc.w    Jfmt08-Ftable    * 24時制時間
  96.     .dc.w    Jfmt09-Ftable    * 12時制時間
  97.     .dc.w    Jfmt0a-Ftable    * AM/PM
  98.     .dc.w    Jfmt0b-Ftable    * 分
  99.     .dc.w    Jfmt0c-Ftable    * 秒
  100. *
  101. * YYYY/MM/DD
  102. * 0123456789
  103. Jfmt02:    * 西暦下2桁
  104.     lea    workd+2(pc),a1
  105.     bra    dt2
  106.  
  107. Jfmt04:    * 月2桁
  108.     lea    workd+5(pc),a1
  109.     bra    dt2
  110.  
  111. Jfmt05:    * 日2桁
  112.     lea    workd+8(pc),a1
  113. dt2:    moveq.l    #2-1,d2        * size (-1 for dbra)
  114.     bra    dt
  115.  
  116. Jfmt01:    * 西暦4桁
  117.     lea    workd(pc),a1
  118.     moveq.l    #4-1,d2        * size
  119. dt:    move.b    (a1)+,(a2)+
  120.     dbra    d2,dt
  121.     rts
  122.  
  123. Jfmt07:    * 曜日日本語1桁
  124.     add.w    d4,d4        * for .w
  125.     lea    Jyoubi(pc,d4.w),a1
  126.     bra    dt2
  127.  
  128. Jfmt06:    * 曜日英字3桁
  129.     move.w    d4,d0
  130.     add.w    d4,d4        * *2
  131.     add.w    d0,d4        * = *3
  132.     lea    Eyoubi(pc,d4.w),a1
  133.     moveq.l    #3-1,d2        * (-1 for dbra)
  134.     bra    dt
  135.  
  136. Jfmt03:    * 平成2桁
  137.     * 1989年=平成元年 ; 1980年+9年
  138.     move.w    heisei(opc),d5
  139. Store10:    * ここはサブルーチンでもある
  140. * d5.w = 数字10進2桁まで
  141.     and.l    #$0000_ffff,d5    * .w = .l
  142.     divu    #10,d5        * d5.l/10 = d5.l.w ... d5.h.w
  143.     bsr    @f        * d5/10
  144.     swap    d5        * d5%10
  145. @@:    add.b    #'0',d5
  146.     move.b    d5,(a2)+
  147.     rts
  148.  
  149. ** 届くようにここに置く
  150.     .even
  151. Jyoubi        .dc.b    '日月火水木金土'
  152. Eyoubi        .dc.b    'SUNMONTUEWEDTHUFRISAT'
  153.     .even
  154. **
  155.  
  156. * HH:MM:SS
  157. * 01234567
  158. Jfmt08:    * 24時制時間
  159.     lea    workt(pc),a1
  160.     bra    dt2
  161.  
  162. Jfmt0b:    * 分
  163.     lea    workt+3(pc),a1
  164.     bra    dt2
  165.  
  166. Jfmt0c:    * 秒
  167.     lea    workt+6(pc),a1
  168.     bra    dt2
  169.  
  170. Jfmt09:    * 12時制時間
  171.     tst.w    d5
  172.     bne    @f
  173.     * hh==0 : 12時制では00時は存在しない->12時
  174.     moveq.l    #12,d5
  175.     bra    Store10
  176.     *
  177. @@:    cmp.w    #13,d5        * hh<13?
  178.     bcs    Store10
  179.     sub.w    #12,d5        * hh-=12
  180.     bra    Store10
  181.  
  182. Jfmt0a:    * AM/PM
  183.     moveq.l    #'P',d0
  184.     cmp.w    #12,d5        * hh>=12?
  185.     bcc    @f        * Yes
  186.     moveq.l    #'A',d0
  187. @@:    move.b    d0,(a2)+
  188.     move.b    #'M',(a2)+
  189.     rts
  190.  
  191. ******************************************************************************
  192.  
  193. MakeDT:
  194. * フォーマット種類に応じた文字列を作成する
  195.     move.l    Dfmt(pc),a0    * フォーマット
  196.     lea    cbuf(opc),a2
  197. @@:    move.b    (a0)+,d0
  198.     cmp.b    #$ff,d0
  199.     bne    1f
  200.     * 置換対象文字列 d0.b->(a2)+
  201.     move.b    (a0)+,d0
  202.     bsr    StoreFMT    * a1破壊
  203.     bra    @b
  204. *
  205. 1:    * 通常文字
  206.     move.b    d0,(a2)+
  207.     bne    @b        * EOSまで
  208.     rts
  209.  
  210. ******************************************************************************
  211.  
  212. ZNumStr:
  213. * 数字を全角文字列化してストア
  214. * 入力:d3.w= y=1~9999(4桁まで)
  215. *    a2  = buf
  216. * 出力:a2  = 次のbuf位置
  217. * 破壊:d0-d2/a0
  218.     moveq.l    #0,d0        * for .w = .l (divuのため)
  219.     move.w    d3,d0
  220.     *
  221.     moveq.l    #1,d1        * 桁数
  222.     cmp.w    #10,d0
  223.     bcs    @f        * <10
  224.     moveq.l    #2,d1        * 桁数
  225.     cmp.w    #100,d0
  226.     bcs    @f        * <100
  227.     moveq.l    #3,d1        * 桁数
  228.     cmp.w    #1000,d0
  229.     bcs    @f        * <1000
  230.     moveq.l    #4,d1        * 桁数(>=1000)
  231. @@:    move.w    d1,d2
  232.     add.w    d2,d2        * 桁数*2
  233.     lea    (a2,d2.w),a0
  234.     move.l    a0,d2        * push a0
  235.     subq.l    #1,d1        * -1 for dbra
  236. @@:    divu    #10,d0        * d0.l/10 = d0.l.w ... d0.h.w
  237.     swap    d0
  238.     add.b    #$4f,d0
  239.     move.b    d0,-(a0)    * d0%10
  240.     move.b    #$82,-(a0)
  241.     clr.w    d0        * 余りを消す for d0=d0/10
  242.     swap    d0
  243.     dbra    d1,@b
  244.     move.l    d2,a2
  245.     rts
  246.  
  247. ******************************************************************************
  248.  
  249. CnvNen:
  250. * int CnvNen(unchar *nen,unchar *buf)
  251. *        4        8
  252. * 年号変換
  253. * nen(cbuf) -> buf
  254. * return : 0=変換不可 , 1=変換可能
  255. * YYYY(西暦)    →    元号YY
  256. * 元号略号YY    →    YYYY(西暦)
  257. regs    =    4*2
  258.     movem.l    d3/d4,-(sp)
  259.     movem.l    4+regs(sp),a1/a2    * a1=nen,a2=buf
  260.     *
  261.     moveq.l    #0,d3            * y=0
  262.     *
  263.     move.b    (a1)+,d0
  264.     lsl.w    #8,d0
  265.     move.b    (a1)+,d0        * 最初の1文字(全角)
  266.     cmp.w    #'a',d0
  267.     bcs    @f            * <'a'
  268.     cmp.w    #'z',d0
  269.     bhi    @f            * >'z'
  270.     sub.w    #'a'-'A',d0        * 全角英小文字->大文字化
  271.     *
  272. @@:    moveq.l    #-1,d4
  273.     lea    ryaku(pc),a0        * 元号略号か?
  274. @@:    addq.w    #1,d4            * i
  275.     move.w    (a0)+,d1
  276.     beq    1f            * End of table
  277.     cmp.w    d1,d0
  278.     bne    @b
  279.     * 元号略号が有った
  280.     bra    LNEN            * 元号の後ろの数字取得へ
  281. *
  282. 1:    * 元号略号無し
  283.     * 正式元号チェック;全角2文字
  284.     swap    d0            * d0<<16
  285.     move.b    (a1),d0
  286.     lsl.w    #8,d0
  287.     move.b    1(a1),d0        * 次の1文字(全角)
  288.     *
  289.     moveq.l    #-1,d4
  290.     lea    gens(pc),a0        * 元号略号か?
  291. @@:    addq.w    #1,d4            * i
  292.     move.l    (a0)+,d1
  293.     beq    12f            * End of table
  294.     cmp.l    d1,d0
  295.     bne    @b
  296.     * 正式元号が有った
  297.     addq.l    #2,a1            * 次の1文字も飛ばす
  298.     bra    LNEN            * 元号の後ろの数字取得へ
  299.     *
  300. 12:    swap    d0            * 最初の1文字へ戻す
  301. 11:    *  年の取得
  302.     cmp.w    #'0',d0
  303.     bcs    @f            * <'0'
  304.     cmp.w    #'9',d0
  305.     bhi    @f            * >'9'
  306.     * 0~9
  307.     add.w    d3,d3            * y*2
  308.     move.w    d3,d1
  309.     add.w    d3,d3            * y*4
  310.     add.w    d3,d3            * y*8
  311.     add.w    d1,d3            * y*8+y*2=y*10
  312.     sub.w    #'0',d0
  313.     add.w    d0,d3
  314.     *
  315. LNEN:    move.b    (a1)+,d0
  316.     lsl.w    #8,d0
  317.     move.b    (a1)+,d0        * 最初の1文字(全角)
  318.     bra    11b
  319.     *
  320. @@:    tst.w    d3
  321.     ble    ret0            * y<=0
  322.     cmp.w    #9999,d3
  323.     bls    @f
  324.     * y>9999
  325. ret0:    moveq.l    #0,d0            * 変換不可;年がない/年がおかしい
  326.     bra    oret
  327. *
  328. @@:    * 変換
  329.     cmp.w    #GEN,d4            * 元号か?
  330.     beq    1f            * No
  331.     * 元号->西暦;有り得ない元号年でも計算可能
  332.     add.w    d4,d4            * for .w
  333.     move.w    nens(pc,d4.w),d0    * nens[i]
  334.     subq.w    #1,d0            * y+=(nens[i]-1); // 元年=1年だから-1
  335.     add.w    d0,d3
  336.     bra    2f
  337. *
  338. 1:    * 西暦->元号
  339.     moveq.l    #0,d4            * i
  340.     move.l    d4,d2            * i for nen[]
  341. 10:    move.w    nens(pc,d2.w),d0    * nens[i]
  342.     addq.w    #2,d2
  343.     move.w    nens(pc,d2.w),d1    * nens[i+1]
  344.     cmp.w    d0,d3
  345.     bcs    3f            * y<nens[i]
  346.     cmp.w    d1,d3
  347.     bcc    3f            * y>=nens[i+1]
  348.     * 範囲内
  349.     subq.w    #1,d0            * nens[i]-1
  350.     sub.w    d0,d3            * y-=..
  351.     move.l    d4,d2
  352.     add.w    d2,d2            * 2
  353.     add.w    d2,d2            * 4
  354.     lea    gens(pc,d2.w),a0
  355.     moveq.l    #4-1,d0
  356. @@:    move.b    (a0)+,(a2)+        * 元号文字列コピー
  357.     dbra    d0,@b
  358.     bra    2f
  359. *
  360. 3:    addq.w    #1,d4            * i++
  361.     cmp.w    #GEN,d4
  362.     bne    10b
  363.     bra    ret0
  364. *
  365. 2:    * 年(全角)
  366.     bsr    ZNumStr            * d3.w,a2
  367.     * 年の後コピー
  368.     subq.l    #2,a1            * nen-2
  369. @@:    move.b    (a1)+,(a2)+
  370.     bne    @b
  371.     *
  372.     moveq.l    #1,d0            * 変換可能
  373. oret:    movem.l    (sp)+,d3/d4
  374.     rts
  375. *
  376. *    西暦           元号        元号略号
  377. *     1868~1912    明治 1~45      M
  378. *     1912~1926    大正 1~15      T
  379. *     1926~1989    昭和 1~64      S
  380. *     1989~        平成 1~      H
  381. *
  382. * 届くようにここに置く(全部even始まり)
  383. ryaku    .dc.w    'M','T','S','H',0
  384. gens    .dc.b    '明治大正昭和平成',0,0,0,0    * 最後の04つは0.l
  385. nens    .dc.w    1868,1912,1926,1989,9999
  386. GEN    equ    4    * 元号の種類数(nensは1つ多い)
  387.     .even
  388.  
  389. ******************************************************************************
  390.  
  391. GetDate    macro
  392. * -> heisei
  393. * -> week
  394. * -> workd = YYYY/MM/DD
  395. *         0123456789
  396.     IOCS    _DATEGET
  397.     move.l    d0,d1
  398.     IOCS    _DATEBIN    * d0.l = WY.YY.MM.DD ; YY=1980~2079,W=0;日~6;土
  399.     move.l    d0,d1
  400.     and.l    #$0fff_ffff,d1    * DATEASC=YYYY/MM/DD
  401.     move.l    d0,d2
  402.     swap    d2        * dtb>>16 : WY.YY
  403.     and.w    #$0fff,d2    * YYY
  404.     sub.w    #1988,d2    * heisei=(dtb>>16)&0xfff-1989+1; // 平成年;元年=1年
  405.     move.w    d2,heisei
  406.     rol.l    #4,d0        * 上位から下位へ4ビット回転で移動
  407.     and.w    #$000f,d0    * W
  408.     move.w    d0,week
  409.     lea    workd(opc),a1
  410.     IOCS    _DATEASC    * d1.l=MD.YYYY/MM/DD -> (a1)+
  411.     .endm
  412.  
  413. *-----------------------------------------------------
  414.  
  415. GetTime    macro
  416. * -> hhのみ
  417. * -> workt = HH:MM:SS
  418. *         01234567
  419. local    L1
  420.     IOCS    _TIMEGET
  421.     move.l    d0,d1
  422.     IOCS    _TIMEBIN    * 00.HH.MM.SS
  423.     move.l    d0,d1
  424.     swap    d0
  425.     move.w    d0,hh        * HHのみ
  426.     lea    workt(opc),a1
  427.     IOCS    _TIMEASC    * HH:MM:SS -> (a1)+
  428.     lea    workt(opc),a1
  429.     move.b    (a1),d0
  430.     cmp.b    #' ',d0        * HH<10のとき、その10の位が' 'になるので'0'にする
  431.     bne    L1
  432.     move.b    #'0',(a1)    * ' ' -> '0'
  433. L1:    *
  434.     .endm
  435.  
  436. *-----------------------------------------------------
  437.  
  438. Dates:
  439. * short    Dates(BIT16K code)
  440. * 日付・時刻入力/年号変換 アクセサリ本体
  441. * 入力:4+2(sp) = BIT16K キーコード
  442. * 出力:d0.w    = リターンコード
  443.     move.w    4+2(sp),d2        * BIT16K キーコード
  444.     move.w    #CACI_NORMAL,d7        * ret=規定外キー入力の時のため
  445.     *
  446.     move.w    #-1,-(sp)        * read BREAK mode
  447.     DOS    _BREAKCK
  448.     move.w    d0,brksts
  449.     clr.w    -(sp)            * BREAK Cut
  450.     DOS    _BREAKCK
  451.     addq.w    #2*2,sp            * BREAKOFF
  452.     *
  453.     tst.b    first            * first?
  454.     beq    2f            * -> No
  455.     tst.b    cbuf            * cbuf[0]=0?
  456.     beq    2f            * -> Yes
  457.     * 変換ラインに入力がある = 年号変換
  458.     pea    zbuf(opc)
  459.     pea    cbuf(opc)
  460.     bsr    CnvNen
  461.     addq.l    #8,sp
  462.     tst.l    d0
  463.     bne    @f
  464.     * 変換不可
  465.     clr.b    cbuf            * cbuf[0]=0; こうしないとcbufは勝手に消えてくれない
  466.     moveq.l    #7,d1
  467.     IOCS    _B_PUTC            * BEEP
  468.     move.w    #CACI_END,d7        * エラー時は無効
  469.     bra    10f
  470.     *
  471. @@:    move.w    #CR,d2            * 以下CRで処理
  472.     *
  473. 2:    * 変換ラインへの入力はない = 日付・時刻入力
  474.     * キーを探して各ルーチンへ飛ぶ
  475.     lea    Jtable(pc),a0
  476.     move.w    d2,d1
  477.     and.w    #NAKEY,d1
  478. @@:    move.l    (a0)+,d0        * jump|code
  479.     beq    10f            * -> end of table
  480.     cmp.w    d1,d0            * =code?
  481.     bne    @b            * no
  482.     swap    d0            * d0=jump
  483.     jsr    -4(a0,d0.w)
  484.     *
  485. 10:    move.w    brksts(opc),-(sp)    * BREAKON
  486.     DOS    _BREAKCK
  487.     addq.w    #2,sp
  488.     *
  489.     moveq.l    #0,d0            * for .w = .l
  490.     move.w    d7,d0
  491.     rts
  492.  
  493. *---------------------------------------
  494.  
  495. Jtable:    * 各キー毎のジャンプテーブル(出てきやすい順に並べる)
  496.     * jump先(offset),code
  497.     * OPT.1+記号入力 : 起動/終了
  498.     * ↑↓ : 選択
  499.     * CR   : 決定&終了
  500.     * SPC  : 半角決定&終了
  501.     * ESC  : 終了
  502.     .dc.w    Jup-$,NOT_ASCII|UP_KEY
  503.     .dc.w    Jdown-$,NOT_ASCII|DOWN_KEY
  504.     .dc.w    Jcr-$,CR
  505.     .dc.w    Jspc-$,SPC
  506.     .dc.w    Jesc-$,ESC
  507.     .dc.w    Jkigou-$,NOT_ASCII|KIGOU_KEY
  508.     .dc.w    0,0            * end of table
  509.  
  510. *---------------------------------------
  511.  
  512. Jkigou:    * 起動
  513. *    btst.l    #B_OPT1_ON,d2        * btstは.b/.lしかないため
  514.     btst.l    #B_CTRL_ON,d2        * btstは.b/.lしかないため
  515.     beq    1f            * CTRLが押されていない
  516.     tst.b    first            * first?
  517.     bne    @f            * -> Yes
  518.     * 2回目以降はキャンセルして終了
  519. Jesc:    * 終了
  520.     st.b    first
  521.     move.w    #CACI_END,d7        * 終了
  522. 1:    rts
  523.     *
  524. @@    clr.b    first            * first=0
  525.     * 日時読みだし(最初だけ)
  526.     GetDate                * 日付読みだし -> workd,heisei,week
  527.     GetTime                * 時刻読みだし -> workt,hh
  528.     lea    MesNichiji(pc),a0
  529.     move.l    #mbuf,d0
  530.     bsr    Str2MEANS
  531.     move.w    #DF_KWINSTR|DF_MWINSTR|CACI_NORMAL,d7
  532.     bra    DEX2
  533.  
  534. *---------------------------------------
  535.  
  536. Jup:    * ↑: 前のフォーマットへ
  537.     move.l    Dfmt(pc),a0
  538.     cmp.l    Ffmt(pc),a0
  539.     bne    @f
  540.     move.l    Ffmte(pc),a0    * 先頭である->最後へ
  541. @@:    subq.l    #2,a0        * 前の$00の前
  542. @@:    tst.b    (a0)
  543.     beq    @f
  544.     subq.l    #1,a0
  545.     bra    @b
  546.     *
  547. @@:    addq.l    #1,a0        * $00の次
  548.     bra    DEX
  549. *
  550. Jdown:    * ↓: 次のフォーマットへ
  551.     move.l    Dfmt(pc),a0
  552. @@:    tst.b    (a0)
  553.     beq    @f
  554.     addq.l    #1,a0
  555.     bra    @b
  556.     *
  557. @@:    addq.l    #1,a0        * $00の次
  558.     cmp.l    Ffmte(pc),a0
  559.     bne    DEX
  560.     move.l    Ffmt(pc),a0    * 最後である->先頭へ
  561. DEX:    move.l    a0,Dfmt
  562.     move.w    #DF_KWINSTR|CACI_NORMAL,d7
  563. DEX2:    * 変換ラインに全角化して表示
  564.     bsr    MakeDT
  565.     pea    zbuf(opc)
  566.     pea    cbuf(opc)
  567.     pea    13.w        * 半角→全角
  568.     DOS    _KNJCTRL
  569.     lea    12(sp),sp
  570.     *
  571.     lea    zbuf(opc),a0
  572.     move.l    #kbuf,d0
  573. Str2MEANS:    * ここはサブルーチンでもある
  574. * buf[Str2MEAN(mes,buf,1)]=0
  575. * a0   <- mes
  576. * d0.l <- buf
  577.     pea    1.w        * 今回は反転表示しかない
  578.     move.l    d0,-(sp)    * buf
  579.     pea    (a0)        * mes
  580.     pea    62.w
  581.     DOS    _KNJCTRL
  582.     lea    4*4(sp),sp
  583.     move.l    -8(sp),a0    * buf
  584.     add.w    d0,d0        * .w=MEAN
  585.     clr.w    (a0,d0.w)    * buf[..]=0
  586.     *
  587.     rts
  588.  
  589. *---------------------------------------
  590.  
  591. Jcr:    * 全角出力
  592.     lea    zbuf(pc),a0
  593.     lea    cbuf(pc),a1
  594. @@:    move.b    (a0)+,(a1)+    * strcpy(cbuf,zbuf)
  595.     bne    @b
  596. Jspc:    * 半角出力
  597.     move.w    #DF_OUTSTR|CACI_END,d7
  598.     st.b    first
  599.     rts
  600.  
  601. ******************************************************************************
  602. * ワーク2
  603. ******************************************************************************
  604. * ここに置くワークは、常駐後に使われるもの
  605. * これらのワークエリアは常駐後に利用可能になるので、
  606. * 以下の非常駐ルーチンからは参照しないこと
  607. *--------------------------------------------------------------------
  608. * オフセットテーブルの定義
  609.     .offset    0
  610. *--------------------------------------------------------------------
  611.  
  612. _brksts        .ds.w    1    * BREAKフラグ
  613. _kbuf        .ds.w    K_SIZE    * 変換ラインへ
  614. _mbuf        .ds.w    M_SIZE    * モード表示領域へ
  615. _cbuf        .ds.b    C_SIZE    * 仮入力行 -> 入力行へ(ユーザーの入力へ)
  616. _zbuf        .ds.b    C_SIZE    * 全角化文字列格納エリア
  617. _heisei        .ds.w    1
  618. _week        .ds.w    1
  619. _hh        .ds.w    1
  620. _workd        .ds.b    11    * 日付文字列格納エリア
  621. _workt        .ds.b    9    * 時刻文字列格納エリア
  622.  
  623.     .even
  624. _keep_end    .ds.w    0    * オフセットのみ
  625.  
  626. *--------------------------------------------------------------------
  627. * 実際のワークエリアの定義
  628. *--------------------------------------------------------------------
  629.  
  630.     .text    * .offset解除
  631. work2:
  632. brksts        equ    work2+_brksts
  633. kbuf        equ    work2+_kbuf
  634. mbuf        equ    work2+_mbuf
  635. cbuf        equ    work2+_cbuf
  636. zbuf        equ    work2+_zbuf
  637. heisei        equ    work2+_heisei
  638. week        equ    work2+_week
  639. hh        equ    work2+_hh
  640. workd        equ    work2+_workd
  641. workt        equ    work2+_workt
  642.  
  643. *********************************************************************
  644. * ワークエリア転送ルーチン
  645. *********************************************************************
  646. * ワークエリアを低位メモリーに取るとき、mallocではなく常駐メモリーを多く取って
  647. * プログラムの後ろに付ける。これは、メモリーの分断を防ぐためである。
  648. *
  649. TrnsWork:
  650. * /hがないとき+常駐終了時のみここにくる
  651. * a0,a2<- 元のFfmt0
  652. * a1   <- KEEP_END
  653. * d0.l <- ワークエリアサイズ
  654. * d1.l <- 常駐サイズ
  655. * d7.l <- exit code
  656.     * 転送
  657. @@:    move.b    (a0)+,(a1)+    * 元Ffmt0->KEEP_END
  658.     dbra    d0,@b
  659.     * 高位メモリーワーク解放
  660.     pea    (a2)        * Ffmt0
  661.     DOS    _MFREE
  662.     addq.w    #4,sp        * めんどうなのでエラー処理は省略
  663. ComEnd:    * コマンドライン
  664.     clr.w    -(sp)        * exit(0)相当
  665.     move.l    d6,-(sp)    * 常駐サイズ
  666.     DOS    _KEEPPR
  667. TrnsWorkEnd:
  668.  
  669. *--------------------------------------------------------------------
  670. * 転送ルーチンサイズ<ワークエリアサイズである
  671. * 常駐部分最後
  672.  
  673. KEEP_END    equ    work2+_keep_end
  674.  
  675. ******************************************************************************
  676. *    非常駐ルーチン
  677. ******************************************************************************
  678. * アクセサリ定義構造体
  679. ******************************************************************************
  680.  
  681.     .even
  682. ACdef:
  683.     .dc.w    KS_EDIT0|KS_EDITING|KS_SELECT    * いつでも
  684. *    .dc.w    NOT_ASCII|OPT1_ON|KIGOU_KEY    * 呼びだしキー
  685.     .dc.w    NOT_ASCII|CTRL_ON|KIGOU_KEY    * 呼びだしキー
  686.     .dc.l    Dates                * アクセサリーメイン
  687.     .dc.l    cbuf
  688.     .dc.l    kbuf
  689.     .dc.l    mbuf
  690.  
  691. ******************************************************************************
  692. *    アクセサリ 組み込み/解除/初期化
  693. *******************************************************************************
  694.  
  695. DeleteAcc:
  696. * 入力:a2 = ACh
  697. * 出力:d0.l = 0:ok , !=0:エラー
  698. * 破壊:d0
  699.     move.l    a0,-(sp)        * push a0
  700.     lea    MesDates(pc),a0
  701.     bsr    Print
  702.     move.l    (a2),-(sp)        * ACh
  703.     pea    61.w
  704.     DOS    _KNJCTRL
  705.     addq.l    #4*2,sp
  706.     lea    MesDeleteOk(pc),a0    * ok message
  707.     tst.l    d0
  708.     beq    @f            * ret=0:Ok
  709.     lea    ErrCantDelete(pc),a0    * error
  710. @@:    bsr    Print
  711.     move.l    (sp)+,a0        * pop a0
  712.     rts
  713.  
  714. *******************************************************************************
  715.  
  716. AttachAcc:
  717. * アクセサリの登録
  718. * 入力:なし
  719. * 出力:d0.l = 0:ok , !=0:エラー
  720. * 破壊:d0,d1,a0
  721.     * ASKのバージョンチェック
  722.     pea    50.w
  723.     DOS    _KNJCTRL
  724.     addq.l    #4,sp
  725.     cmp.l    #300,d0        * <300? (V3.00未満?)
  726.     bcc    @f        * No (V3.00以降)
  727.     * ASK V3.00以降でない
  728.     lea    ErrASK3(pc),a0
  729.     moveq.l    #3,d0        * return(3)
  730.     bra    1f
  731. *
  732. @@:    * アクセサリの登録
  733.     lea    MesDates(pc),a0
  734.     bsr    Print
  735.     pea    ACdef(pc)
  736.     pea    60.w
  737.     DOS    _KNJCTRL
  738.     addq.l    #4*2,sp
  739.     cmp.l    #-1,d0        * error?
  740.     bne    @f        * no
  741.     * アクセサリに登録出来ない
  742.     lea    ErrCantAttach(pc),a0
  743.     moveq.l    #4,d0        * return(4)
  744.     bra    1f
  745. *
  746. @@:    move.l    d0,ACh        * ACh=ret;
  747.     lea    MesAttachOk(pc),a0
  748.     moveq.l    #0,d0        * return(0)
  749. 1:    bsr    Print
  750.     rts
  751.  
  752. ******************************************************************************
  753.  
  754. SetFormats:
  755. * フォーマットファイルの読み込み
  756.     movem.l    d1-d3/d6/a0-a2,-(sp)
  757.     clr.w    -(sp)
  758.     pea    fname(opc)
  759.     DOS    _OPEN
  760.     addq.l    #6,sp
  761.     move.l    d0,d6
  762.     bpl    @f
  763.     moveq.l    #1,d0        * ファイルが見つからない
  764.     bra    Ret0
  765.     *
  766. @@:    move.w    #2,-(sp)
  767.     clr.l    -(sp)
  768.     move.w    d6,-(sp)
  769.     DOS    _SEEK        * ファイルサイズ
  770.     move.l    d0,all
  771.     move.l    d0,d2        * len
  772.     clr.w    -(sp)
  773.     clr.l    -(sp)
  774.     move.w    d6,-(sp)
  775.     DOS    _SEEK        * ファイル先頭へ戻す
  776.     lea    16(sp),sp
  777.     *
  778.     * ファイルを読むこむためのワーク確保
  779.     move.l    d2,-(sp)    * len
  780.     move.w    #2,-(sp)    * 常に上位メモリーから
  781.     DOS    _MALLOC2
  782.     addq.l    #6,sp
  783.     tst.l    d0
  784.     bgt    @f
  785.     moveq.l    #2,d3        * メモリー確保出来ない
  786.     bra    Ret2
  787.     *
  788. @@:    move.l    d0,Ffmt0
  789.     move.l    d0,a0
  790.     *
  791.     * フォーマットファイルはまるごと読み込めば良い
  792.     move.l    d2,-(sp)    * len
  793.     move.l    a0,-(sp)    * Ffmt0
  794.     move.w    d6,-(sp)    * fp
  795.     DOS    _READ
  796.     lea    10(sp),sp
  797.     cmp.l    d2,d0
  798.     beq    @f
  799.     moveq.l    #3,d3        * READ error
  800.     bra    Ret
  801.     *
  802. @@:    * ワーク設定
  803.     lea    HEADLEN(a0),a1
  804.     move.l    a1,Ffmt
  805.     move.l    a1,Dfmt        * 最初
  806.     add.l    a0,d2        * Ffmt0+len
  807.     move.l    d2,Ffmte    * ワークエンド+1
  808.     *
  809.     * ヘッダーチェック
  810.     moveq.l    #0,d3        * ret=0
  811.     moveq.l    #HEADLEN-1,d0
  812.     * a0=Ffmt0
  813.     lea    HEADER(pc),a2
  814. @@:    cmp.b    (a0)+,(a2)+
  815.     dbne    d0,@b
  816.     beq    @f
  817.     moveq.l    #4,d3        * ret=4 : ヘッダーが違う
  818. @@:    clr.b    -1(a1)        * Ffmt[-1]=0 : 前フォーマットサーチを止めるため
  819. Ret:    tst.l    d3
  820.     beq    Ret2
  821.     * エラー時 : Ffmt0解放
  822.     move.l    Ffmt0(pc),d0
  823.     move.l    d0,-(sp)
  824.     DOS    _MFREE
  825.     addq.l    #4,sp
  826. Ret2:    move.w    d6,-(sp)
  827.     DOS    _CLOSE
  828.     addq.w    #2,sp
  829.     move.l    d3,d0
  830. Ret0:    movem.l    (sp)+,d1-d3/d6/a0-a2
  831.     rts
  832.  
  833. ******************************************************************************
  834.  
  835. EPrint:
  836. * エラー出力に表示する
  837. * 表示は全てこれで行っている
  838. * 入力:a0 = 文字列
  839. * 破壊:なし
  840.     move.l    d0,-(sp)    * push d0
  841.     move.w    #2,-(sp)    * STDERR
  842.     pea    (a0)        * 文字列
  843.     DOS    _FPUTS        * エラー出力へ
  844.     addq.l    #2+4,sp
  845.     move.l    (sp)+,d0    * pop d0
  846.     rts
  847.  
  848. Print:
  849. * 標準出力に表示する(リダイレクト可)
  850. * 入力:a0 = 文字列
  851. * 破壊:なし
  852.     move.l    d0,-(sp)    * push d0
  853.     pea    (a0)        * 文字列
  854.     DOS    _PRINT
  855.     addq.l    #4,sp
  856.     move.l    (sp)+,d0    * pop d0
  857.     rts
  858.  
  859. ******************************************************************************
  860. * この中ではa0/a2は壊さないこと(プロセス管理ポインタ/コマンドラインを参照するため)
  861.  
  862. AMAX    equ    10    * 最大引数数
  863.  
  864. * コマンドライン
  865. * a2
  866. * 0(a2)   = コマンドライン長
  867. * 1(a2)~ = コマンドライン
  868. *        '-r ',0    スペース/タブはそのまま
  869. *
  870. GetArgv:
  871. * コマンドラインを解析して各要素の先頭アドレスをargvに、個数をargcに格納する
  872. * 引数:a2   = コマンドライン
  873. * 出力:d0.w = 引数数(=argc)
  874. * 破壊:d0-d1
  875.     movem.l    a2/a6,-(sp)
  876.     moveq.l    #0,d1        * 引数数
  877.     tst.b    (a2)+        * コマンドライン長を飛ばす
  878.     beq    2f        * コマンドライン長=0 -> 引数なし
  879.     lea    argv(pc),a6
  880. @@:    * SPC/TAB skip
  881.     move.b    (a2)+,d0
  882.     beq    2f        * コマンドライン終わり
  883.     cmp.b    #SPC,d0        * skip SPC
  884.     beq    @b
  885.     cmp.b    #TAB,d0        * skip TAB
  886.     beq    @b
  887.     * SPC/TAB以外の文字が有った
  888.     subq.l    #1,a2
  889.     move.l    a2,(a6)+    * argv記録
  890.     addq.w    #1,d1        * 引数+1
  891.     cmp.w    #AMAX,d1    * 最大数を越える?
  892.     bcc    2f        * -> 越える
  893. 1:    * 次のEOS/SPC/TABまで飛ばす
  894.     move.b    (a2)+,d0
  895.     beq    2f        * コマンドライン終わり
  896.     cmp.b    #SPC,d0        * skip SPC
  897.     beq    @b
  898.     cmp.b    #TAB,d0        * skip TAB
  899.     bne    1b
  900.     bra    @b
  901.     *
  902. 2:    move.w    d1,argc        * 記録
  903.     move.w    d1,d0
  904.     movem.l    (sp)+,a2/a6
  905.     rts
  906.  
  907. *---------------------------------------------
  908.  
  909. CheckOption:
  910. * コマンドラインから指定オプションを探す
  911. * 必ずGetArgvを呼び出した後に使うこと
  912. * オプション名は先頭1文字だけで判別
  913. * 引数:d2.b = オプション名(英小文字1文字)
  914. * 出力:d0.l = 0:なし , !=0:そのオプションの次のアドレス
  915. * 破壊:d0-d1
  916.     movem.l    a5-a6,-(sp)
  917.     move.w    argc(pc),d1
  918.     beq    1f        * 引数はない
  919.     subq.w    #1,d1        * -1 for dbra
  920.     lea    argv(pc),a6
  921. @@:    move.l    (a6)+,a5    * argv[i]
  922.     move.b    (a5)+,d0    * argv[i][0]
  923.     * オプションの1文字目は'/''-'
  924.     cmp.b    #'/',d0
  925.     beq    2f
  926.     cmp.b    #'-',d0
  927.     beq    2f
  928. 3:    dbra    d1,@b        * 次へ
  929. 1:    * (指定)オプションはない
  930.     moveq.l    #0,d0
  931.     bra    4f
  932.  
  933. 2:    * '/''-'があった
  934.     move.b    (a5)+,d0    * 次の1文字
  935.     or.b    #$20,d0        * 英小文字化
  936.     cmp.b    d2,d0        * 一致?
  937.     bne    3b        * -> 不一致
  938.     move.l    a5,d0        * オプション名の次のアドレス(!=0)
  939. 4:    movem.l    (sp)+,a5-a6
  940.     rts
  941.  
  942. *---------------------------------------------
  943.  
  944. Getfname:
  945. * コマンドラインからオプション以外の指定番目の引数を取り出す
  946. * 必ずGetArgvを呼び出した後に使うこと
  947. * 引数:d2.w = 何番目か(1~argc)
  948. *    d0.l = 転送先アドレス(サイズ判定していないので十分なサイズを持つこと)
  949. * 出力:d0.w = 0:なし , >=1:その引数番目
  950. * 破壊:d0-d1
  951.     movem.l    d3/a0/a5/a6,-(sp)
  952.     move.l    d0,a0        * 転送先アドレス
  953.     move.w    argc(pc),d1
  954.     beq    1f        * argc=0:元から引数はない
  955.     cmp.w    d1,d2        * argc>=指定番目?
  956.     bhi    1f        * No : この番目の引数は絶対にない
  957.     subq.w    #1,d1        * -1 for dbra
  958.     moveq.l    #0,d3        * 順番
  959.     lea    argv(pc),a6
  960. 2:    move.l    (a6)+,a5    * argv[i]
  961.     move.b    (a5),d0        * argv[i][0]
  962.     cmp.b    #'/',d0        * オプションは飛ばす
  963.     beq    3f
  964.     cmp.b    #'-',d0
  965.     beq    3f
  966.     * 引数有り
  967.     addq.w    #1,d3        * 引数順番
  968.     cmp.w    d2,d3        * 指定順番のものか?
  969.     bne    3f        * No
  970.     * 指定順番のものである -> 指定バッファーに転送
  971. @@:    move.b    (a5)+,d0
  972.     beq    4f        * EOS
  973.     cmp.b    #SPC,d0        * 転送終了はEOS/SPC/TABがくるまで
  974.     beq    4f
  975.     cmp.b    #TAB,d0
  976.     beq    4f
  977.     move.b    d0,(a0)+
  978.     bra    @b
  979. *
  980. 4:    clr.b    (a0)        * EOS
  981.     move.w    d3,d0        * 引数有り
  982.     bra    @f
  983. *
  984. 3:    dbra    d1,2b        * 次の引数へ
  985. 1:    * 指定番目の引数はない
  986.     moveq.l    #0,d0
  987.     move.b    d0,(a0)        * 転送先バッファーにもEOSだけ書き込んでおく
  988. @@:    movem.l    (sp)+,d3/a0/a5/a6
  989.     rts
  990.  
  991. ******************************************************************************
  992. *    メイン
  993. ******************************************************************************
  994.  
  995.     .xref    keepchk
  996. main:
  997.     lea.l    initsp(pc),sp    * PROGRAM=の時のため
  998.     
  999.     * タイトル表示
  1000.     move.w    #2,-(sp)    * STDERR
  1001.     pea    title(pc)    * 文字列
  1002.     DOS    _FPUTS        * エラー出力へ
  1003.     addq.l    #2+4,sp
  1004.     *
  1005.     move.l    #(id-KEEP_START),-(sp)    * 識別子の相対位置
  1006.     pea.l    (a0)        * 自分のメモリ管理ポインタ
  1007.     bsr    keepchk        * 常駐チェック
  1008.     addq.l    #4*2,sp
  1009.     move.b    d0,d7        * d7 :0=常駐してない , -1=常駐している
  1010.     
  1011.     * 引数チェック1
  1012.     bsr    GetArgv        * argc/argv設定
  1013.     tst.w    d0
  1014.     beq    usage        * 引数がない -> 説明表示 ; ASKDates V2は引数が必要
  1015.     moveq.l    #'r',d2        * -r : 常駐解除?
  1016.     bsr    CheckOption
  1017.     tst.l    d0
  1018.     beq    keep        * no
  1019. *
  1020. * 常駐解除
  1021. *
  1022.     tst.b    d7        * 常駐している?
  1023.     beq    Err_NoKp    * No -> error
  1024.     
  1025.     * a0=常駐しているルーチンのメモリ管理ポインタ
  1026.     * メモリー管理ポインタを飛ばし、ユーザープログラム先頭へ
  1027.     * さらに、AChまで飛ばす
  1028.     lea    fhigh-KEEP_START+PSPSIZ(a0),a4        * fhighのアドレス
  1029.     tst.b    (a4)                    * ワークは高位メモリー?
  1030.     beq    @f                    * No : 低位メモリーの時は解放ずみ
  1031.     lea    Ffmt0-KEEP_START+PSPSIZ(a0),a2
  1032.     move.l    (a2),-(sp)    * Ffmt0のアドレス
  1033.     DOS    _MFREE        * メモリー解放
  1034.     addq.w    #4,sp
  1035.     
  1036. @@:    lea.l    ACh-KEEP_START+PSPSIZ(a0),a2        * AChのアドレス
  1037.     bsr    DeleteAcc    * アクセサリ解除
  1038.     tst.l    d0
  1039.     bne    Err_Kai        * アクセサリ登録削除不可により常駐解除不可
  1040.     *
  1041.     pea.l    MPSIZ(a0)
  1042.     DOS    _MFREE        * 自己プロセスメモリー解放
  1043.     addq.l    #4,sp
  1044.     tst.l    d0
  1045.     bmi    Err_Kai        * なぜかメモリー解放出来ない時
  1046.     *
  1047.     * 常駐解除正常終了
  1048.     lea    MesRelease(pc),a0
  1049.     bsr    Print
  1050.     clr.w    -(sp)        * exit(0)
  1051.     DOS    _EXIT2
  1052.  
  1053. keep:    * 常駐
  1054.     tst.b    d7        * 常駐している?
  1055.     bne    Err_Dbl        * Yes -> error(2重常駐)
  1056.     *
  1057.     * プログラム起動時にはフリーエリアの全てが起動プログラムに割り当てられているため、
  1058.     * これを必要部分以外解放する。そうしないとMALLOCが効かない。
  1059.     * a0=プログラムメモリ管理ポインタ
  1060.     * a1=プログラム終了アドレス+1(.data,.bssを含む)
  1061.     lea    MPSIZ(a0),a0    * メモリー管理ポインタ分を飛ばす
  1062.     move.l    a0,ProcAD    * このプロセスの先頭アドレス保存
  1063.     sub.l    a0,a1        * 当プログラムサイズ
  1064.     move.l    a1,-(sp)    * 確保する領域サイズ
  1065.     move.l    a0,-(sp)    * 確保する領域の先頭アドレス
  1066.     DOS    _SETBLOCK    * 空き領域確保
  1067.     addq.w    #4*2,sp
  1068.     tst.l    d0
  1069.     bmi    Err_Mem        * 領域が確保できない時=エラー
  1070.     *
  1071.     * フォーマットファイル名取得
  1072.     lea    fname(opc),a3    * .bssなので(pc)は使えない
  1073.     moveq.l    #1,d2        * 1番目
  1074.     move.l    a3,d0        * fname
  1075.     bsr    Getfname
  1076.     tst.w    d0
  1077.     beq    Err_NoFmt    * フォーマットファイルが指定されていない
  1078.     *
  1079.     * フォーマットファイル読み込み
  1080.     bsr    SetFormats
  1081.     tst.l    d0
  1082.     bne    Err_Fmt        * フォーマットエラー
  1083.     *
  1084.     * アクセサリ組み込み
  1085.     bsr    AttachAcc
  1086.     tst.l    d0
  1087.     bne    Err_Keep    * 組み込みエラー
  1088.     *
  1089.     * アクセサリも組み込みOK
  1090.     lea    MesKeep(pc),a0
  1091.     bsr    Print
  1092.     
  1093.     move.l    #KEEP_END-KEEP_START,d6    * 基本常駐サイズ
  1094.     moveq.l    #'h',d2            * -h : 高位メモリー?
  1095.     bsr    CheckOption
  1096.     tst.l    d0
  1097.     bne    ComEnd            * Yes
  1098.     *
  1099.     * 低位メモリーの時
  1100.     clr.b    fhigh            * 低位メモリー確保の印
  1101.     *
  1102.     * ワークエリアアドレス変更
  1103.     * このプロセスの占めるメモリー領域を拡大してワークも入るようにする
  1104.     add.l    all(pc),d6        * ワークエリアサイズ
  1105.     move.l    d6,d0
  1106.     add.l    #PSPSIZ-MPSIZ,d0    * プロセス管理ポインタ分も含める
  1107.     move.l    d0,-(sp)        * new size
  1108.     move.l    ProcAD(pc),-(sp)
  1109.     DOS    _SETBLOCK
  1110.     addq.w    #8,sp
  1111.     bmi    Err_Mem            * メモリー不足
  1112.     *
  1113.     * TrnsWorkを小さくするために、できるだけこちらに置いている
  1114.     * ワークエリアポインターを変更
  1115.     move.l    Ffmt0(pc),a2        * 元のFfmt0
  1116.     lea    KEEP_END(pc),a1
  1117.     move.l    a1,Ffmt0        * Ffmt0をKEEP_ENDに変更
  1118.     *
  1119.     move.l    Ffmt(pc),d0
  1120.     sub.l    a2,d0
  1121.     add.l    a1,d0
  1122.     move.l    d0,Ffmt
  1123.     move.l    d0,Dfmt
  1124.     *
  1125.     move.l    Ffmte(pc),d0
  1126.     sub.l    a2,d0
  1127.     add.l    a1,d0
  1128.     move.l    d0,Ffmte
  1129.     *
  1130.     lea    KEEP_END(pc),a1    * (a0) -> (a1)
  1131.     move.l    a2,a0        * a0=a2=元のFfmt0
  1132.     move.l    all(pc),d0    * サイズ
  1133.     subq.l    #1,d0        * -1 for dbra
  1134.     bra    TrnsWork
  1135. *
  1136. * エラー終了
  1137. *
  1138. Err_Mem:    * メモリーが不足している
  1139.     lea.l    ErrCantGetWrk(pc),a0
  1140.     bra    error
  1141. Err_Fmt:    * フォーマットファイルが異常
  1142.     lea.l    ErrFmt(pc),a0
  1143.     bra.s    error
  1144. Err_NoFmt:    * フォーマットファイルが指定されていない
  1145.     lea.l    ErrNoFmt(pc),a0
  1146.     bra.s    error
  1147. Err_NoKp:    * 常駐していないのに解除しようとした
  1148.     lea.l    NoKeep(pc),a0
  1149.     bra.s    error
  1150. Err_Dbl:    * 2重常駐
  1151.     lea.l    AlreadyKeep(pc),a0
  1152.     bra.s    error
  1153. Err_Keep:    * 常駐できない
  1154.     lea.l    CantKeep(pc),a0
  1155.     bra.s    error
  1156. Err_Kai:    * 常駐解除不可
  1157.     lea.l    CantRelease(pc),a0
  1158.     bra.s    error
  1159. usage:    * 使用法
  1160.     lea.l    MesUsage(pc),a0
  1161. error:    bsr    EPrint        * エラー出力へ表示
  1162. erRet:    move.w    #2,-(sp)    * exit(2)
  1163.     DOS    _EXIT2
  1164.  
  1165. ******************************************************************************
  1166. * メッセージなど
  1167. ******************************************************************************
  1168.  
  1169.     .even
  1170. MesDates:    .dc.b    'アクセサリ「日付・時刻入力/年号変換」',0
  1171. MesDeleteOk:    .dc.b    'を削除しました',$0d,$0a,0
  1172. ErrCantDelete:    .dc.b    'が削除できません',$0d,$0a,0
  1173. ErrCantAttach:    .dc.b    'が登録できません',$0d,$0a,0
  1174. MesAttachOk:    .dc.b    'を登録しました',$0d,$0a,0
  1175. ErrASK3:    .dc.b    'ASKがバージョン3以上ではありません',$0d,$0a,0
  1176.  
  1177. title:        .dc.b    'ASK3アクセサリ ASKDates V2.01',$0d,$0a
  1178.         .dc.b    $09,'Copyright 1998 by AIG-Soft'    * CrLfにつながる
  1179. CrLf        .dc.b    $0d,$0a
  1180. Eoss        .dc.b    0
  1181. MesKeep:    .dc.b    '常駐しました',$0d,$0a,0
  1182. MesRelease:    .dc.b    '常駐解除しました',$0d,$0a,0
  1183. NoKeep:        .dc.b    '常駐していません',$0d,$0a,0
  1184. AlreadyKeep:    .dc.b    'すでに常駐しています',$0d,$0a,0
  1185. CantKeep:    .dc.b    '常駐できません',$0d,$0a,0
  1186. CantRelease:    .dc.b    '常駐解除できません',$0d,$0a,0
  1187. MesUsage:    .dc.b    'ASKDates フォーマットファイル [/R /H]',$0d,$0a,0
  1188.  
  1189. * メッセージ
  1190. ErrCantGetWrk:    .dc.b    'ワークエリアが確保できません',$0d,$0a,0
  1191. ErrNoFmt    .dc.b    'フォーマットファイルを指定して下さい',$0d,$0a,0
  1192. ErrFmt        .dc.b    'フォーマットファイルが異常です',$0d,$0a,0
  1193.  
  1194. * フォーマットファイルヘッダー
  1195. HEADER        .dc.b    'ASKDates FMT1',$0d,$0a,$1a
  1196. *             1234567890123  4   5   6
  1197. HEADLEN        equ    16
  1198.  
  1199.     .even
  1200. argc        .ds.w    1        * 引数の個数
  1201. argv        .ds.l    AMAX        * 各引数の先頭アドレス
  1202.  
  1203. ******************************************************************************
  1204. * 非常駐ルーチンが使うワーク
  1205. ******************************************************************************
  1206.     .bss
  1207.     .even
  1208. ProcAD        .ds.l    1        * このプロセスの先頭アドレス
  1209. fname        .ds.b    255        * 一時的にファイル名を格納するところ
  1210.  
  1211. ******************************************************************************
  1212. * 非常駐ルーチンが使うスタック
  1213. ******************************************************************************
  1214.     .stack
  1215.     .even
  1216.     .ds.l    512
  1217. initsp:
  1218. ******************************************************************************
  1219.     .end    main
  1220.